package com.zjl.Kafka.第04章_分布式扩展;

/**
 * 1.数据在磁盘和网络之间进行传输时候，
 * 在Linux上可以享受到零拷贝机制带来的快捷和便利高效，
 * 而Windows在一定程度上会使用零拷贝操作。
 *
 * 2.Kafka存储方式为顺序读写,机械硬盘的最大劣势在于随机读写慢。
 * 所以使用机械硬盘并不会造成性能低下。
 * 所以磁盘选用普通机械硬盘即可，
 * Kafka 自身已经有冗余机制，而且通过分区的设计，实现了负载均衡的功能。
 * 不做磁盘组raid阵列也是可以的。
 *
 * 3.设计场景:日志数据每天向kafka发送1亿条数据，
 * 每条数据有两个副本防止数据丢失，数据保存两周，每条消息平均大小为1KB.
 * 1) 每天1亿条1KB消息，保存两份，则每天总大小为:
 * (100000000 * 1KB * 2)/1024/1024 ≈ 200GB
 * 2) kafka 除了消息数据还有其他类型的数据，故增加10%的冗余空间，则需要220GB
 * 3)两周时间则为 220 GB*14 ≈ 3TB
 * 4)如果启用压缩，压缩比约在0.75左右，则总存储空间规划为 3TB*0.75=2.25TB
 *
 * 4.网络带宽
 * 如果网络为万兆带宽，基本不会出现网络瓶颈，
 * 如果数据量特别大,按照下文中的设计场景进行计算。
 * 如果网络为百兆或者千兆带宽，在处理较大数据量场景下会出现网络瓶颈，
 * 可按照下面的传统经验公式进行计算处理，也可按照下述场景按照自己生产实际情况进行设计。
 *
 * 经验公式:服务器台数 = 2 x (生产者峰值生产速率 x 副本数 ÷ 100)+ 1
 *
 * 带宽情况最容易成为kafka的瓶颈。
 * 设计场景:如果机房为千兆带宽，我们需要在一小时内处理 1TB的数据，需要多少台
 *
 * 1)由于带宽为千兆网， 1000Mbps = lGbps,则每秒钟每个服务器能收到的数据量为
 * 1Gb = 1000Mb
 * 2)假设 Kafka占用整个服务器网络的70% (其他30%为别的服务预留)，则Kafka
 * 可以使用到700Mb的带宽，但是如果从常规角度考虑，我们不能总让Kafka顶满
 * 带宽峰值，所以需要预留出2/3甚至3/4的资源，也就是说，Kafka 单台服务器使
 * 用带宽实际应为 700Mb/3 = 240Mb
 * 3) 1小时需要处理1TB数据，1TB = 1024* 1024* 8Mb= 8000000Mb，
 * 则一秒钟处理数据量为: 8000000Mb/ 3600s=2330Mb数据。
 * 4)需要的服务器台数为: 2330Mb/240Mb ≈ 10台。
 * 5)考虑到消息的副本数如果为 2,则需要20台服务器，副本如果为3，则需要30台服务器。
 *
 * 5内存配置
 * Kafka运行过程中设计到的内存主要为JVM的堆内存和操作系统的页缓存，
 * 每个Broker节点的堆内存建议10-15G内存，而数据文件(默认为1G)的25%在内存就可以了。
 * 综合上述, Kafka在大数据场景下能够流畅稳定运行至少需要 11G,建议安装Kafka的服务
 * 器节点的内存至少大于等于16G。
 *
 * 在生产环境中，建议CPU核数最少为16核，建议32核以上，
 * 方可保证大数据环境中的Kafka集群正常处理与运行。
 *
 * *****************************提高性能的配置*******************************************************
 * num.io.threads                           8                       服务端     低延迟
 * socket.send.buffer.bytes                 102400( 100K)           服务端     高吞吐
 * socket.receive.buffer.bytes              65536(64K)              服务端     高吞吐场景
 * max.in.flight.requests.per.connection    5                       生产端     幂等
 * buffer.memory                            33554432(32M)           生产端     高吞吐
 * batch.size                               16384(16K)              生产端     提高性能
 * linger.ms                                0                       生产端     提高性能
 * fetch.min.bytes                          1                       消费端     提高性能        网络交互次数
 * max.poll.records                         500                     消费端     批量处理        控制批量获取消息数量
 * ************************************************************************************
 * 数据压缩和批量发送
 * 通过压缩和批量发送可以优化Kafka的性能表现。Kafka 支持多种数据压缩算法,
 * 包括 Gzip、Snappy、 LZ4 和zstd。在不同场景下，需要选择合适的压缩算法，以确保性能最优。
 *
 * 下面的表格为网络上不同压缩算法的测试数据，仅作参考
 * 压缩算法         压缩比率            压缩效率    解压缩效率
 * snappy           2.073           580m/s       2020m/s
 * lz4              2.101           800m/s      4220m/s
 * zstd             2.884           520m/s       1600m/s
 *
 * 从表格数据可以直观看出，zstd 有着最高得压缩比，而LZ4算法，在吞吐量上表现得非常高效。
 * 对于Kafka而言，在吞吐量上比较: lz4 > snappy > zstd > gzip。
 *              而在压缩比上:  zstd > lz4 > gzip > snappy
 * Kafka支持两种批处理方式:
 *      异步批处理和同步批处理。在不同场景下，需要选择合适的批处理方式，进行性能优化。
 *      同时需要合理设置批处理参数,如 batch.size、linger.ms寺。
 *
 */
public class G_kafka优化概念 {

}
